package com.ruoyi.web.controller.system;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysArea;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysAreaService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 行政区划信息
 *
 * @author ruoyi
 */
@Api(tags = "行政区划")
@RestController
@RequestMapping("/system/areas")
public class SysAreaController extends BaseController {

    @Autowired
    private ISysAreaService areaService;

    /**
     * 获取行政区划列表
     */
    @ApiOperation("获取行政区划列表")
    @PreAuthorize("@ss.hasRole('admin')")
    @GetMapping
    public AjaxResult list(SysArea area) {
        List<SysArea> areas = areaService.selectAreaList(area);
        return AjaxResult.success(areas);
    }

    /**
     * 查询行政区划列表（排除节点）
     */
    @ApiOperation("查询行政区划列表（排除节点）")
    @PreAuthorize("@ss.hasRole('admin')")
    @GetMapping("/exclude/{areaCode}")
    public AjaxResult excludeChild(@PathVariable(value = "areaCode", required = false) String areaCode) {
        List<SysArea> areas = areaService.selectAreaList(new SysArea());
        areas.removeIf(d -> d.getAreaCode().equals(areaCode)
                || ArrayUtils.contains(StringUtils.split(d.getAncestorCode(), ","), areaCode + ""));
        return AjaxResult.success(areas);
    }

    /**
     * 根据行政区划编号获取详细信息
     */
    @ApiOperation("根据行政区划编号获取详细信息")
    @PreAuthorize("@ss.hasRole('admin')")
    @GetMapping(value = "/{areaCode}")
    public AjaxResult getInfo(@PathVariable String areaCode) {
        areaService.checkAreaDataScope(areaCode);
        return AjaxResult.success(areaService.selectAreaByCode(areaCode));
    }

    /**
     * 获取行政区划下拉树列表
     */
    @ApiOperation("获取行政区划下拉树列表")
    @GetMapping("/treeselect")
    public AjaxResult treeselect(SysArea area) {
        List<SysArea> areas = areaService.selectAreaList(area);
        return AjaxResult.success(areaService.buildAreaTreeSelect(areas));
    }

    /**
     * 新增行政区划
     */
    @ApiOperation("新增行政区划")
    @PreAuthorize("@ss.hasRole('admin')")
    @Log(title = "行政区划管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysArea area) {
        if (UserConstants.NOT_UNIQUE.equals(areaService.checkAreaCodeUnique(area))) {
            return AjaxResult.error("新增行政区划'" + area.getAreaCode() + "'失败，行政区划编号已存在");
        }
        if (UserConstants.NOT_UNIQUE.equals(areaService.checkAreaNameUnique(area))) {
            return AjaxResult.error("新增行政区划'" + area.getAreaName() + "'失败，行政区划名称已存在");
        }
        return toAjax(areaService.insertArea(area));
    }

    /**
     * 修改行政区划
     */
    @ApiOperation("修改行政区划")
    @PreAuthorize("@ss.hasRole('admin')")
    @Log(title = "行政区划管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysArea area) {
        if (UserConstants.NOT_UNIQUE.equals(areaService.checkAreaCodeUnique(area))) {
            return AjaxResult.error("新增行政区划'" + area.getAreaCode() + "'失败，行政区划编号已存在");
        } else if (UserConstants.NOT_UNIQUE.equals(areaService.checkAreaNameUnique(area))) {
            return AjaxResult.error("修改行政区划'" + area.getAreaName() + "'失败，行政区划名称已存在");
        } else if (area.getParentCode().equals(area.getAreaCode())) {
            return AjaxResult.error("修改行政区划'" + area.getAreaName() + "'失败，上级行政区划不能是自己");
        }
        return toAjax(areaService.updateArea(area));
    }

    /**
     * 删除行政区划
     */
    @ApiOperation("删除行政区划")
    @PreAuthorize("@ss.hasRole('admin')")
    @Log(title = "行政区划管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{areaCode}")
    public AjaxResult remove(@PathVariable String areaCode) {
        if (areaService.hasChildByAreaCode(areaCode)) {
            return AjaxResult.error("存在下级行政区划,不允许删除");
        }
        return toAjax(areaService.deleteAreaByCode(areaCode));
    }
}
